package com.example.store.service.impl;

import com.example.store.entity.Cart;
import com.example.store.entity.Product;
import com.example.store.mapper.CartMapper;
import com.example.store.mapper.ProductMapper;
import com.example.store.service.ICartService;
import com.example.store.service.ex.AccessDeniedException;
import com.example.store.service.ex.CartNotFoundException;
import com.example.store.service.ex.InsertException;
import com.example.store.service.ex.UpdateException;
import com.example.store.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Service
public class CartServiceImpl implements ICartService {
    /** 购物车的业务层依赖于购物车的持久层和商品的持久层 */
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private ProductMapper productMapper;

    /**
     * 将商品添加到购物车
     *
     * @param uid      用户id
     * @param pid      商品id
     * @param amount   新增数量
     * @param username 用户名（修改者）
     */
    @Override
    public void addToCart(Integer uid,
                          Integer pid,
                          Integer amount,
                          String username) {
        //查询当前要添加的这个购物是否在表中已经存在
        Cart result = cartMapper.findByUidAndPid(uid, pid);
        Date date = new Date();
        if(result == null){
            // 表示当前商品在购物车不存在，则进行新增操作
            // 创建一个cart对象
            Cart cart = new Cart();
            //  补全数据:参数传递过来的数据
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(amount);
            // 补全价格：来自于商品中的价格
            Product product = productMapper.findById(pid);
            cart.setPrice(product.getPrice());
            // 补全4个日志
            cart.setCreatedUser(username);
            cart.setCreatedTime(date);
            cart.setModifiedUser(username);
            cart.setModifiedTime(date);

            // 执行输入的插入操作
            Integer rows = cartMapper.insert(cart);
            if(rows != 1){
                throw new InsertException("插入数据时产生未知的异常");
            }

        } else {
            // 表示当前商品在购物车已经存在，则更新这条数据的num值
            Integer num = result.getNum() + amount;
            Integer rows = cartMapper.updateNumByCid(
                                            result.getCid(),
                                            num,
                                            username,
                                            date
                                        );
            if(rows!=1){
                throw new UpdateException("更新数据时产生未知的异常");
            }
        }
    }

    /**
     * 根据用户id查询CartVO
     *
     * @param uid 用户id
     * @return 返回值对象（VO）
     */
    @Override
    public List<CartVO> getVOByUid(Integer uid) {
        return cartMapper.findVOByUid(uid);
    }

    /**
     * 在购物车页面进行商品数量 加减
     *
     * @param cid      商品cid
     * @param uid      用户id
     * @param username 用户名字（修改者）
     * @return 返回加减后的商品数量
     */
    @Override
    public Integer addNum(Integer cid, Integer uid, String username) {
        Cart result = cartMapper.findByCid(cid);
        if(result == null){
            throw new CartNotFoundException("商品数据不存在");
        }
        if(!result.getUid().equals(uid)){
            throw new AccessDeniedException("数据非法访问");
        }
        Integer num = result.getNum() + 1;
        Integer rows = cartMapper.updateNumByCid(cid, num, username, new Date());
        if(rows != 1){
            throw new UpdateException("更新数据失败");
        }
        //返回新的购物车数据的总数
        return num;
    }

    @Override
    public Integer reduceNum(Integer cid, Integer uid, String username) {
        Cart result = cartMapper.findByCid(cid);
        if(result == null){
            throw new CartNotFoundException("商品数据不存在");
        }
        if(!result.getUid().equals(uid)){
            throw new AccessDeniedException("数据非法访问");
        }
        Integer num = result.getNum() - 1;
        Integer rows = cartMapper.updateNumByCid(cid, num, username, new Date());
        if(rows != 1){
            throw new UpdateException("更新数据失败");
        }
        //返回新的购物车数据的总数
        return num;
    }

    /**
     * 根据购物车商品cid查询商品数据
     *
     * @param cids 购物车商品cid
     * @param uid  用户id
     * @return 商品数据
     */
    @Override
    public List<CartVO> getVOByCid(Integer[] cids, Integer uid) {
        List<CartVO> list = cartMapper.findVOByCid(cids);
        Iterator<CartVO> it =  list.iterator();
        while(it.hasNext()){
            CartVO cartVO = it.next();
            if(!cartVO.getUid().equals(uid)){ //表示当前数据（cid）不属于该用户id
                it.remove(); // 从list中删除该条（cid）数据
            }
        }
        return list;
    }
}
